Reshuffle action muxer initialization
authorMatthias Clasen <mclasen@redhat.com>
Tue, 28 Apr 2020 22:34:23 +0000 (18:34 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 28 Apr 2020 22:37:43 +0000 (18:37 -0400)
We were having a problem where property actions were
not getting state updates because prop_actions_connect
was triggered from some instance_init function while
the widget class is not in place yet.

Delay that call until the widget is fully constructed,
so we can guarantee that we are dealing with the
correct class private struct, and see all class actions.

gtk/gtkactionmuxer.c
gtk/gtkactionmuxerprivate.h
gtk/gtkwidget.c

index 26ca311efc5369bfd5ebf30f905389aa0d4d1806..256406fa815ffa93959f277a7da0311266207d58 100644 (file)
@@ -864,14 +864,10 @@ gtk_action_muxer_dispose (GObject *object)
     ->dispose (object);
 }
 
-static void
-gtk_action_muxer_constructed (GObject *object)
+void
+gtk_action_muxer_connect_class_actions (GtkActionMuxer *muxer)
 {
-  GtkActionMuxer *muxer = GTK_ACTION_MUXER (object);
-
   prop_actions_connect (muxer);
-
-  G_OBJECT_CLASS (gtk_action_muxer_parent_class)->constructed (object);
 }
 
 static void
@@ -949,7 +945,6 @@ gtk_action_muxer_class_init (GObjectClass *class)
 {
   class->get_property = gtk_action_muxer_get_property;
   class->set_property = gtk_action_muxer_set_property;
-  class->constructed = gtk_action_muxer_constructed;
   class->finalize = gtk_action_muxer_finalize;
   class->dispose = gtk_action_muxer_dispose;
 
index 0c5670c6f88eb00aefd41aa331573d383e2cff3c..516e2420d7f25a25de8600b8644a5d67a12a3a98 100644 (file)
@@ -81,6 +81,7 @@ gtk_action_muxer_action_state_changed (GtkActionMuxer *muxer,
                                        const gchar    *action_name,
                                        GVariant       *state);
 
+void gtk_action_muxer_connect_class_actions (GtkActionMuxer *muxer);
 
 /* No better place for these... */
 gchar *                 gtk_print_action_and_target                     (const gchar    *action_namespace,
index e060581b6d43cde52d501a758553728e04179e76..8ee76a263d82edfc690ccfb9842508b1f75d4a01 100644 (file)
@@ -865,6 +865,20 @@ gtk_widget_real_unroot (GtkWidget *widget)
   gtk_widget_forall (widget, (GtkCallback) gtk_widget_unroot, NULL);
 }
 
+static void
+gtk_widget_constructed (GObject *object)
+{
+  G_OBJECT_CLASS (gtk_widget_parent_class)->constructed (object);
+
+  if (GTK_WIDGET_GET_CLASS (object)->priv->actions)
+    {
+      GtkActionMuxer *muxer;
+
+      muxer = _gtk_widget_get_action_muxer (GTK_WIDGET (object), TRUE);
+      gtk_action_muxer_connect_class_actions (muxer);
+    }
+}
+
 static void
 gtk_widget_class_init (GtkWidgetClass *klass)
 {
@@ -882,6 +896,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   quark_font_options = g_quark_from_static_string ("gtk-widget-font-options");
   quark_font_map = g_quark_from_static_string ("gtk-widget-font-map");
 
+  gobject_class->constructed = gtk_widget_constructed;
   gobject_class->dispose = gtk_widget_dispose;
   gobject_class->finalize = gtk_widget_finalize;
   gobject_class->set_property = gtk_widget_set_property;